extends Control

var cat_list = preload("res://categoriesHBC/categories_hbc.tscn")

@onready var back_btn : Button = $ColorRect/MarginContainer/VBoxContainer/HBoxContainer/BackBtn
@onready var search_input : LineEdit = $ColorRect/MarginContainer/VBoxContainer/SearchInput
@onready var categories_lists : VBoxContainer = $ColorRect/MarginContainer/VBoxContainer/ColorRect/CategoriesLists
@onready var add_category_btn : Button = $ColorRect/MarginContainer/VBoxContainer/VBoxContainer/Buttons/AddCategory

#список категори для удобного сворачивания
var categories_ids_list : Array[int] = []

func _ready():
	back_btn.pressed.connect(_go_to_main_page)
	search_input.text_changed.connect(_on_dec_number_input)
	
	categories_lists.add_child(new_categories_list())

func new_categories_list(category_id: int = -1) -> ScrollContainer:
	var categories_list = cat_list.instantiate()
	categories_list.this_list_category_id = category_id
	categories_list.open_subcategoriy.connect(_open_next_category)
	categories_list.close_subcategoriy.connect(_collaps_category)
	categories_list.reopen_subcategoriy.connect(_reopen_next_category)
	
	if ENV.current_catalog_path.is_empty():
		add_category_btn.disabled = true
	elif add_category_btn.pressed.get_connections().size() == 0:
		add_category_btn.pressed.connect(_append_category)
	
	return categories_list

func _append_category():
	get_tree().change_scene_to_file("res://add_category/add_category.tscn")

func _reopen_next_category(old_subcategory_id: int, new_subcategory_id: int):
	_collaps_category(old_subcategory_id)
	_open_next_category(new_subcategory_id)

func _open_next_category(category_id: int):
	print("DEBB:: open next categories of category: ", category_id)
	categories_ids_list.push_back(category_id)
	categories_lists.add_child(new_categories_list(category_id))

#функция сворачивания откытых категорий. Принимает идетификатор категории 
#до которой всё нужно свернуть.
#ЗАКОНЧИЛ ЗДЕСЬ, КАКАЯ-ТО ХЕРНЯ С ЗАКРЫВАНИЕМ
func _collaps_category(category_id: int):
	print("DEBB:: collaps category: ", category_id)
	if not categories_ids_list:
		print("WARN:: empty categories_ids_list")
		return
#получим идентификатор последней категории
	var cat_id : int = categories_ids_list.pop_back()
	print("DEBB:: next_cat_id: ", cat_id, " categories_ids_list: ", categories_ids_list)
#если ничего нет, то вернёся null, если есть, то проверим, что
#это - не категория после которой всё нужно свернуть
#и если всё окей, то получим список с текущим ид-ом и удалим его.
	while cat_id:
		var category := get_category_by_id(cat_id)
		if category:
			print("DEBB:: category to collaps: ", category)
			#if categories_lists.get_children().has(category):
			categories_lists.remove_child(category)
			category.queue_free()
		else:
			print("DEBB:: category is false: ")
			break
		if cat_id == category_id:
			break
		if not categories_ids_list.is_empty():
			cat_id = categories_ids_list.pop_back()
			print("DEBB:: next_cat_id: ", cat_id)
		else:
			cat_id = 0
	#var 
	#get_category_by_id(cat_id).opened_subcategory = -1
	#categories_ids_list.push_back(cat_id)

#проходится по списку списков категорий и возвращает категорию, если категория
#с таким идентификатором есть в списке
func get_category_by_id(category_id:int) -> ScrollContainer:
	var categories : Array = categories_lists.get_children()
	
	for category_list in categories:
		if category_list.this_list_category_id == category_id:
			print("DEBB:: get_category_by_id: category_id: ", category_id, " category_list: ", category_list)
			return category_list
	return null

func _input(event):
	if event.is_action_pressed("ui_cancel"):
		_go_to_main_page()

func _go_to_main_page():
	get_tree().change_scene_to_file("res://main_page/main_page.tscn")

func _on_dec_number_input(input):
	var regexp := RegEx.new()
	regexp.compile("^[0-9]{1,6}$")
	if not regexp.search(input):
		search_input.delete_char_at_caret()
